{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Users\\35139\\anaconda3\\Lib\\site-packages\\torch\\utils\\_pytree.py:185: FutureWarning: optree is installed but the version is too old to support PyTorch Dynamo in C++ pytree. C++ pytree support is disabled. Please consider upgrading optree using `python3 -m pip install --upgrade 'optree>=0.13.0'`.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "import  torch.nn.functional as F \n",
    "import torch.nn as nn \n",
    "import torch.optim as optim\n",
    "from torch.utils.data import DataLoader,random_split\n",
    "from torchvision import datasets\n",
    "import torchvision.transforms as transforms\n",
    "\n",
    "torch.manual_seed(1024)\n",
    "\n",
    "dataset = datasets.MNIST(root = './mnist',train = True,\n",
    "download = True,transform= transforms.ToTensor())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(torch.Size([1, 28, 28]), 0)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x,y = dataset[21]\n",
    "x.shape,y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### squeeze 为压缩函数,unsqueeze为扩展函数\n",
    "非常常用的两个函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x23e13bac950>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAb/ElEQVR4nO3df2xV9f3H8delwhW1vazU9rZSsKDCJtJlTLpGrCgNpUsMCFv8tViMwciKE5g/UqMiuqQbJn6NhulMNjoywV8RiGRjwWLL3AoTlDRks6GkGzXQomy9ty1SSPv5/kG480IrnMu9fd97eT6Sk/Sec949bz6e3JfnntPP9TnnnAAAGGYjrBsAAFycCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYuMS6gTMNDAzo0KFDyszMlM/ns24HAOCRc07d3d0qKCjQiBFDX+ckXQAdOnRIhYWF1m0AAC5Qe3u7xo0bN+T2pAugzMxMSacaz8rKMu4GAOBVOBxWYWFh5P18KAkLoDVr1uiFF15QR0eHiouL9corr2jGjBnnrDv9sVtWVhYBBAAp7Fy3URLyEMJbb72lFStWaOXKlfrkk09UXFysiooKHTlyJBGHAwCkoIQE0IsvvqjFixfr/vvv13e+8x299tpruuyyy/S73/0uEYcDAKSguAfQiRMntGfPHpWXl//vICNGqLy8XE1NTWft39fXp3A4HLUAANJf3APoyy+/VH9/v/Ly8qLW5+XlqaOj46z9a2trFQgEIgtPwAHAxcH8D1FramoUCoUiS3t7u3VLAIBhEPen4HJycpSRkaHOzs6o9Z2dnQoGg2ft7/f75ff7490GACDJxf0KaNSoUZo+fbrq6+sj6wYGBlRfX6/S0tJ4Hw4AkKIS8ndAK1asUFVVlb7//e9rxowZeumll9Tb26v7778/EYcDAKSghATQnXfeqS+++ELPPPOMOjo69N3vfldbt24968EEAMDFy+ecc9ZNfF04HFYgEFAoFGImBABIQef7Pm7+FBwA4OJEAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATl1g3ACD5NDQ0eK657bbbPNc45zzXxNLbLbfc4rkGiccVEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABNMRgqksbq6upjqXn75Zc81GRkZnmv6+/s91yxfvtxzTVVVlecaSaqurvZcc8klvK2eL66AAAAmCCAAgIm4B9Czzz4rn88XtUyZMiXehwEApLiEfFh5/fXX64MPPvjfQfhMFABwhoQkwyWXXKJgMJiIXw0ASBMJuQe0f/9+FRQUaOLEibr33nt18ODBIfft6+tTOByOWgAA6S/uAVRSUqK6ujpt3bpVr776qtra2nTzzTeru7t70P1ra2sVCAQiS2FhYbxbAgAkobgHUGVlpX784x9r2rRpqqio0B//+Ed1dXXp7bffHnT/mpoahUKhyNLe3h7vlgAASSjhTweMGTNG1113nVpbWwfd7vf75ff7E90GACDJJPzvgHp6enTgwAHl5+cn+lAAgBQS9wB69NFH1djYqH/961/629/+pjvuuEMZGRm6++67430oAEAKi/tHcJ9//rnuvvtuHT16VFdeeaVmzpypnTt36sorr4z3oQAAKcznnHPWTXxdOBxWIBBQKBRSVlaWdTtA0ohlYtF169bFdKy//OUvMdV5FctkpLFMehqroe5df5MJEyYkoJPUcr7v48wFBwAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwETCv5AOSCVdXV2ea/bu3eu55v777/dc88UXX3iu6evr81wTqylTpniuiWUy0v3793uuQXLiCggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYILZsJGWNm3aFFPd66+/7rlm27ZtnmtimQU6IyPDc81weuyxxzzXDAwMeK5ZvHix5xokJ66AAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmGAyUiS9P/zhD55r7rvvvgR0Ej/OOc81sUxgOpxi+TfFItnHAeeP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b37juUY69R1fQKJxBQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEk5FCV111VUx1q1at8lwzceJEzzUvvPCC55qWlhbPNZI0ZcoUzzWPPfaY55pYxmHmzJmea4BkxhUQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEz7nnLNu4uvC4bACgYBCoZCysrKs2wEAeHS+7+NcAQEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwISnAKqtrdWNN96ozMxM5ebmav78+WppaYnaZ9asWfL5fFHLQw89FNemAQCpz1MANTY2qrq6Wjt37tS2bdt08uRJzZkzR729vVH7LV68WIcPH44sq1evjmvTAIDUd4mXnbdu3Rr1uq6uTrm5udqzZ4/Kysoi6y+77DIFg8H4dAgASEsXdA8oFApJkrKzs6PWv/HGG8rJydHUqVNVU1OjY8eODfk7+vr6FA6HoxYAQPrzdAX0dQMDA1q2bJluuukmTZ06NbL+nnvu0YQJE1RQUKDm5mY98cQTamlp0XvvvTfo76mtrdWqVatibQMAkKJ8zjkXS+GSJUv0pz/9SR999JHGjRs35H7bt2/X7Nmz1draqkmTJp21va+vT319fZHX4XBYhYWFCoVCysrKiqU1AIChcDisQCBwzvfxmK6Ali5dqi1btmjHjh3fGD6SVFJSIklDBpDf75ff74+lDQBACvMUQM45Pfzww9q4caMaGhpUVFR0zpq9e/dKkvLz82NqEACQnjwFUHV1tdavX6/NmzcrMzNTHR0dkqRAIKDRo0frwIEDWr9+vX74wx9q7Nixam5u1vLly1VWVqZp06Yl5B8AAEhNnu4B+Xy+QdevXbtWixYtUnt7u37yk59o37596u3tVWFhoe644w499dRT530/53w/OwQAJKeE3AM6V1YVFhaqsbHRy68EAFykmAsOAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJ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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(x.squeeze(0).numpy(),cmap = plt.cm.binary)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_set,val_set = random_split(dataset,[50000,10000])\n",
    "test_set = datasets.MNIST(root = './mnist',train = False,\n",
    "download = True,transform= transforms.ToTensor())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_loader = DataLoader(train_set, batch_size=500,shuffle=True)\n",
    "val_loader = DataLoader(val_set, batch_size=500,shuffle=True)\n",
    "test_loader = DataLoader(test_set,batch_size= 500,shuffle=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(torch.Size([500, 1, 28, 28]), torch.Size([500]))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x,y = next(iter(train_loader))\n",
    "x.shape,y.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 将二维张量转换为一维向量\n",
    "x.view(x.shape[0],-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([500, 784])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.view(x.shape[0],-1).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 常见搭模型的路线\n",
    "- 构建一个类,继承nn.Module\n",
    "- 使用封装好的pytorch里面的 Sequential类.这种方法比较简单,但是不能构造复杂的模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "class MLP(nn.Module):\n",
    "    def __init__(self):\n",
    "        pass\n",
    "    def forward(self):\n",
    "        pass\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = nn.Sequential(\n",
    "        nn.Linear(784,32) , nn.Sigmoid(),\n",
    "        nn.Linear(32,16) , nn.Sigmoid(),\n",
    "        nn.Linear(16,10)  \n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型评估\n",
    "需要注意两点\n",
    "1. 使用的不是所有数据,而是若干个效果的平均值\n",
    "2. 在评估的过程中并需要计算梯度\n",
    "\n",
    "一般来说流程为\n",
    "1. 定义模型,收集数据\n",
    "2. 定义模型评估函数\n",
    "3. 训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "eval_iters = 10\n",
    "\n",
    "def estimate_loss(model):\n",
    "    re = {}\n",
    "    re['train'] = _loss(model,train_loader)\n",
    "    re['val'] = _loss(model,val_loader)\n",
    "    re['test'] = _loss(model,test_loader)\n",
    "    return re\n",
    "\n",
    "@torch.no_grad\n",
    "def _loss(model,dataloader):\n",
    "    # 估算模型损失\n",
    "    loss = []\n",
    "    acc = []\n",
    "    data_iter = iter(dataloader)\n",
    "    for t in range(eval_iters):\n",
    "        inputs,labels = next(data_iter)\n",
    "        # inputs (500,1,28,28)\n",
    "        # labels (500)\n",
    "        B,C,H,W = inputs.shape\n",
    "\n",
    "        logits = model(inputs.view(B,-1))\n",
    "        loss.append(F.cross_entropy(logits,labels))\n",
    "        # 需要注意这里选择的 dim = -1 将数据压缩到第一个维度上\n",
    "        preds = torch.argmax(logits, dim = -1)\n",
    "        acc.append((preds == labels).sum() / B)\n",
    "        re = {\n",
    "            'loss' : torch.tensor(loss).mean().item(),\n",
    "            'acc' : torch.tensor(acc).mean().item()\n",
    "        }\n",
    "    return re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'loss': 2.335344076156616, 'acc': 0.10379999876022339}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "_loss(model,train_loader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'train': {'loss': 2.335529327392578, 'acc': 0.0981999933719635},\n",
       " 'val': {'loss': 2.3374314308166504, 'acc': 0.09639999270439148},\n",
       " 'test': {'loss': 2.3366522789001465, 'acc': 0.0934000015258789}}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimate_loss(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_model(model,optimizer,epochs = 10):\n",
    "    lossi = []\n",
    "    for e in range(epochs):\n",
    "        for data in train_loader:\n",
    "            inputs, labels = data\n",
    "            B,C,H,W = inputs.shape\n",
    "            logits = model(inputs.view(B,-1))\n",
    "            loss = F.cross_entropy(logits,labels)\n",
    "            optimizer.zero_grad()\n",
    "            loss.backward()\n",
    "            lossi.append(loss.item())\n",
    "            optimizer.step()\n",
    "        # 评估模型\n",
    "        stats = estimate_loss(model)\n",
    "        train_loss =f'{stats[\"train\"][\"loss\"]:.3f}'\n",
    "        val_loss =f'{stats[\"val\"][\"loss\"]:.3f}'\n",
    "        test_loss =f'{stats[\"test\"][\"loss\"]:.3f}'\n",
    "        print(f'epoch {e}, train {train_loss},val {val_loss},test {test_loss}')    \n",
    "    return lossi\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "loss = {}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 0, train 2.319,val 2.321,test 2.318\n",
      "epoch 1, train 2.306,val 2.306,test 2.304\n",
      "epoch 2, train 2.300,val 2.301,test 2.301\n",
      "epoch 3, train 2.299,val 2.300,test 2.299\n",
      "epoch 4, train 2.298,val 2.298,test 2.299\n",
      "epoch 5, train 2.299,val 2.297,test 2.298\n",
      "epoch 6, train 2.297,val 2.297,test 2.298\n",
      "epoch 7, train 2.295,val 2.296,test 2.297\n",
      "epoch 8, train 2.296,val 2.296,test 2.295\n",
      "epoch 9, train 2.296,val 2.295,test 2.295\n",
      "epoch 10, train 2.295,val 2.295,test 2.294\n",
      "epoch 11, train 2.295,val 2.294,test 2.294\n",
      "epoch 12, train 2.294,val 2.294,test 2.294\n",
      "epoch 13, train 2.295,val 2.294,test 2.293\n",
      "epoch 14, train 2.292,val 2.293,test 2.293\n",
      "epoch 15, train 2.293,val 2.293,test 2.291\n",
      "epoch 16, train 2.292,val 2.292,test 2.291\n",
      "epoch 17, train 2.290,val 2.290,test 2.290\n",
      "epoch 18, train 2.290,val 2.290,test 2.291\n",
      "epoch 19, train 2.289,val 2.289,test 2.289\n",
      "epoch 20, train 2.288,val 2.288,test 2.287\n",
      "epoch 21, train 2.287,val 2.287,test 2.287\n",
      "epoch 22, train 2.287,val 2.286,test 2.286\n",
      "epoch 23, train 2.284,val 2.286,test 2.286\n",
      "epoch 24, train 2.283,val 2.283,test 2.284\n",
      "epoch 25, train 2.285,val 2.283,test 2.283\n",
      "epoch 26, train 2.282,val 2.282,test 2.283\n",
      "epoch 27, train 2.280,val 2.281,test 2.281\n",
      "epoch 28, train 2.280,val 2.278,test 2.280\n",
      "epoch 29, train 2.276,val 2.278,test 2.278\n",
      "epoch 0, train 2.271,val 2.273,test 2.273\n",
      "epoch 1, train 2.215,val 2.220,test 2.216\n",
      "epoch 2, train 2.125,val 2.132,test 2.128\n",
      "epoch 3, train 2.011,val 2.013,test 2.005\n",
      "epoch 4, train 1.852,val 1.859,test 1.854\n",
      "epoch 5, train 1.662,val 1.657,test 1.643\n",
      "epoch 6, train 1.427,val 1.420,test 1.400\n",
      "epoch 7, train 1.175,val 1.199,test 1.160\n",
      "epoch 8, train 0.982,val 0.987,test 0.971\n",
      "epoch 9, train 0.831,val 0.858,test 0.830\n",
      "epoch 10, train 0.734,val 0.754,test 0.721\n",
      "epoch 11, train 0.656,val 0.669,test 0.649\n",
      "epoch 12, train 0.602,val 0.635,test 0.583\n",
      "epoch 13, train 0.569,val 0.598,test 0.546\n",
      "epoch 14, train 0.554,val 0.578,test 0.539\n",
      "epoch 15, train 0.528,val 0.530,test 0.504\n",
      "epoch 16, train 0.510,val 0.530,test 0.502\n",
      "epoch 17, train 0.484,val 0.515,test 0.467\n",
      "epoch 18, train 0.457,val 0.493,test 0.464\n",
      "epoch 19, train 0.468,val 0.485,test 0.452\n",
      "epoch 20, train 0.457,val 0.475,test 0.428\n",
      "epoch 21, train 0.450,val 0.448,test 0.427\n",
      "epoch 22, train 0.441,val 0.451,test 0.424\n",
      "epoch 23, train 0.433,val 0.446,test 0.411\n",
      "epoch 24, train 0.420,val 0.442,test 0.413\n",
      "epoch 25, train 0.411,val 0.419,test 0.405\n",
      "epoch 26, train 0.395,val 0.434,test 0.393\n",
      "epoch 27, train 0.394,val 0.412,test 0.389\n",
      "epoch 28, train 0.384,val 0.417,test 0.386\n",
      "epoch 29, train 0.389,val 0.429,test 0.390\n",
      "epoch 0, train 1.505,val 1.506,test 1.494\n",
      "epoch 1, train 1.145,val 1.149,test 1.141\n",
      "epoch 2, train 0.864,val 0.865,test 0.847\n",
      "epoch 3, train 0.667,val 0.676,test 0.654\n",
      "epoch 4, train 0.540,val 0.548,test 0.531\n",
      "epoch 5, train 0.436,val 0.465,test 0.444\n",
      "epoch 6, train 0.384,val 0.402,test 0.386\n",
      "epoch 7, train 0.342,val 0.361,test 0.338\n",
      "epoch 8, train 0.301,val 0.350,test 0.311\n",
      "epoch 9, train 0.275,val 0.307,test 0.295\n",
      "epoch 10, train 0.260,val 0.288,test 0.263\n",
      "epoch 11, train 0.243,val 0.278,test 0.261\n",
      "epoch 12, train 0.230,val 0.275,test 0.247\n",
      "epoch 13, train 0.214,val 0.250,test 0.221\n",
      "epoch 14, train 0.200,val 0.246,test 0.207\n",
      "epoch 15, train 0.194,val 0.247,test 0.218\n",
      "epoch 16, train 0.182,val 0.218,test 0.204\n",
      "epoch 17, train 0.180,val 0.221,test 0.209\n",
      "epoch 18, train 0.168,val 0.211,test 0.199\n",
      "epoch 19, train 0.161,val 0.212,test 0.192\n",
      "epoch 20, train 0.155,val 0.208,test 0.179\n",
      "epoch 21, train 0.161,val 0.201,test 0.190\n",
      "epoch 22, train 0.137,val 0.184,test 0.181\n",
      "epoch 23, train 0.158,val 0.210,test 0.191\n",
      "epoch 24, train 0.138,val 0.190,test 0.171\n",
      "epoch 25, train 0.126,val 0.181,test 0.182\n",
      "epoch 26, train 0.139,val 0.185,test 0.176\n",
      "epoch 27, train 0.129,val 0.178,test 0.176\n",
      "epoch 28, train 0.134,val 0.188,test 0.172\n",
      "epoch 29, train 0.121,val 0.180,test 0.163\n"
     ]
    }
   ],
   "source": [
    "model = nn.Sequential(\n",
    "        nn.Linear(784,32) , nn.Sigmoid(),\n",
    "        nn.Linear(32,16)  ,nn.Sigmoid(),\n",
    "        nn.Linear(16,10)  \n",
    ")\n",
    "\n",
    "model_relu = nn.Sequential(\n",
    "        nn.Linear(784,32) , nn.ReLU(),\n",
    "        nn.Linear(32,16)  ,nn.ReLU(),\n",
    "        nn.Linear(16,10)  \n",
    ")\n",
    "\n",
    "\n",
    "model_relu_layer = nn.Sequential(\n",
    "        nn.Linear(784,32,bias=False),nn.LayerNorm(32) , nn.ReLU(),\n",
    "        nn.Linear(32,16,bias=False) , nn.LayerNorm(16) ,nn.ReLU(),\n",
    "        nn.Linear(16,10)  \n",
    ")\n",
    "\n",
    "\n",
    "loss['mlp'] = train_model(model,optim.SGD(model.parameters(),lr = 0.01), epochs=30)\n",
    "loss['mlp_relu'] = train_model(model_relu,optim.SGD(model_relu.parameters(),lr = 0.01),epochs=30)\n",
    "loss['mlp_relu_layer'] = train_model(model_relu_layer,optim.SGD(model_relu_layer.parameters(),lr = 0.01),epochs=30)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x23e1cee4110>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for i in ['mlp','mlp_relu','mlp_relu_layer']:\n",
    "    plt.plot(torch.tensor(loss[i]).view(-1,10).mean(dim = -1) ,label = i)\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
